
在開發過程中,我們經常面臨物件結構複雜、型別不一致的問題。
透過 TypeScript 的強大型別系統,你可以更精準地掌握物件的型別,避免常見的程式錯誤。
本文將帶你深入了解如何運用 TypeScript 的物件處理技巧,幫助你寫出穩定、易維護的程式碼,讓開發變得更輕鬆有趣。
我們從一個簡單的結構開始,這個結構代表一筆訂單,包含了商品和客戶資訊。我們定義了一個 defaultOrder 物件,這個物件作為我們型別定義和驗證的原型。
const defaultOrder = {
  articles: [
    {
      price: 1200.50,
      vat: 0.2,
      title: 'Macbook Air Refurbished - 2013'
    },
    {
      price: 9,
      vat: 0,
      title: 'I feel smashing subscription'
    }
  ],
  customer: {
    name: 'Fritz Furball',
    address: {
      city: 'Smashing Hill',
      zip: '90210',
      street: 'Whisker-ia Lane',
      number: '1337'
    },
    dateOfBirth: new Date(2006, 9, 1)
  }
}
typeof 抽取型別TypeScript 的 typeof 運算子可以直接從現有的物件中抽取型別,確保型別與物件保持同步。在範例中,我們從 defaultOrder 物件中抽取出型別 Order:
type Order = typeof defaultOrder;
使用 typeof 的好處在於它能精準地捕捉物件的結構,避免重複且容易出錯的手動型別定義。這樣的做法完美符合 TypeScript 的 DRY(Don’t Repeat Yourself)原則。
(下一篇再來好好談到什麼是DRY原則)
接下來我們實作一個函式 checkOrders,它接受一個 Order 型別的陣列,並檢查每筆訂單是否包含商品。此函式透過使用 defaultOrder 抽取的型別,強調了類型安全的重要性。
/**
 * 檢查所有訂單是否都有商品
 */
function checkOrders(orders: Order[]): boolean {
  let valid = true;
  for (let order of orders) {
    valid = valid && order.articles.length %3E 0;
  }
  return valid;
}
類型安全:透過 typeof 定義 Order,我們保持了程式碼中型別的一致性,這樣的做法能減少因結構不符而引入的錯誤風險。
函式類型註記:checkOrders 函式明確指定了參數型別 (orders: Order[]) 及回傳型別 (boolean),提供了清晰的文件說明,並能讓 TypeScript 在編譯時期捕捉錯誤。
迭代驗證:函式會遍歷每一筆訂單,檢查 articles 陣列中是否有至少一項商品。使用 Order 型別確保我們訪問 articles 這樣的屬性時,是受類型檢查保護的,避免了執行時因打錯字或缺少欄位導致的錯誤。
演練場
TypeScript: TS Playground - An online editor for exploring TypeScript and JavaScript
使用 typeof 抽取型別:盡可能從物件中使用 typeof 抽取型別,這能確保型別與實際資料保持一致,減少手動維護的麻煩。
明確類型註記:對於函式的參數和回傳值,應該明確標註型別。這不僅提升了程式碼的可讀性,還能讓 TypeScript 提早捕捉錯誤。
重視類型安全勝於靈活性:雖然 JavaScript 容許對物件進行靈活的操作,但 TypeScript 鼓勵對物件結構進行明確且安全的處理。養成類型優先的思維,能防止複雜應用程式中出現預期外的行為。
typeof 抽取型別:確保型別準確性,可以避免手動錯誤。